package com.improvess.rna.som;


public abstract class ProbabilisticSOM extends RedeSOM {

	private int quantidadeDeRegistros;
	private double taxaDecrementoSigma;

	public ProbabilisticSOM(int quantidadeDeNeuronios,
			int quantidadeDeAtributos, double sigmaVizinhancaInicial, int quantidadeDeRegistros, double taxaDecrementoSigma) {
		super(quantidadeDeNeuronios, quantidadeDeAtributos,
				sigmaVizinhancaInicial);
		this.quantidadeDeRegistros = quantidadeDeRegistros;
		this.taxaDecrementoSigma = taxaDecrementoSigma;
	}

	@Override
	public Neuronio vencedor(int indicePadrao) {
		double maiorProbabilidade = -1 * Double.MAX_VALUE;
		Neuronio retorno = this.getNeuronios()[0][0];
		for (int i = 0; i < this.getNeuronios().length; i++) {
			for (int k = 0; k < this.getNeuronios().length; k++) {
				NeuronioPb neuronioPb = (NeuronioPb) this.getNeuronios()[i][k];
				double probabilidade = neuronioPb.getProbabilidadesPosteriori()[indicePadrao];
				if (probabilidade > maiorProbabilidade) {
					maiorProbabilidade = probabilidade;
					retorno = neuronioPb;
				}
			}
		}
		return retorno;
	}
	
	public int getQuantidadeDeRegistros() {
		return quantidadeDeRegistros;
	}

	@Override
	protected Neuronio inicializarNeuronio(int i, int k) {
		NeuronioPb neuronio = new NeuronioPb(i, k , getSigmaVizinhanca());
		double [] probabilidadesPosteriori = new double[this.getQuantidadeDeRegistros()];
		for(int j = 0; j < probabilidadesPosteriori.length ; j++){
			probabilidadesPosteriori [j] = Math.random();
		}
		neuronio.setProbabilidadesPosteriori(probabilidadesPosteriori);
		return neuronio;
	}
	
	public double getTaxaDecrementoSigma() {
		return taxaDecrementoSigma;
	}

}
